﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Data.SqlClient;
using System.Linq;
using System.Net.Mail;
using System.Net.Mime;
using System.Runtime.Serialization;
using System.Text;
using System.Transactions;
using BS_Gimnasio.General;
using DS_Gimnasio;

namespace BS_Gimnasio.RRHH
{
    [DataContract()]
    public class cls_Empleado : cls_Persona
    {
        #region Variables

        private int _idEmpleado;
        private string _direccion;
        private int _idCarreraProfesional;
        private int _telefonoCasa;
        private int _telefonoCelular;
        private int _idTipoEmpleado;
        private int _idGimnasio;
        private int _idDepartamento;
        private int _idCalendarioLaboral;
        private DateTime _fechaIngreso;
        private DateTime _fechaLiquidacion;

        #endregion

        #region Propiedades

        [DataMember()]
        public int IdEmpleado
        {
            get { return _idEmpleado; }
            set { _idEmpleado = value; }
        }

        [DataMember()]
        public string Direccion
        {
            get { return _direccion; }
            set { _direccion = value; }
        }

        [DataMember()]
        public int IdCarreraProfesional
        {
            get { return _idCarreraProfesional; }
            set { _idCarreraProfesional = value; }
        }

        [DataMember()]
        public int TelefonoCasa
        {
            get { return _telefonoCasa; }
            set { _telefonoCasa = value; }
        }

        [DataMember()]
        public int TelefonoCelular
        {
            get { return _telefonoCelular; }
            set { _telefonoCelular = value; }
        }

        [DataMember()]
        public int IdTipoEmpleado
        {
            get { return _idTipoEmpleado; }
            set { _idTipoEmpleado = value; }
        }

        [DataMember()]
        public int IdGimnasio
        {
            get { return _idGimnasio; }
            set { _idGimnasio = value; }
        }

        [DataMember()]
        public int IdDepartamento
        {
            get { return _idDepartamento; }
            set { _idDepartamento = value; }
        }

        [DataMember()]
        public int IdCalendarioLaboral
        {
            get { return _idCalendarioLaboral; }
            set { _idCalendarioLaboral = value; }
        }

        [DataMember()]
        public DateTime FechaIngreso
        {
            get { return _fechaIngreso; }
            set { _fechaIngreso = value; }
        }

        [DataMember()]
        public DateTime FechaLiquidacion
        {
            get { return _fechaLiquidacion; }
            set { _fechaLiquidacion = value; }
        }

        #endregion

        #region Metodos Heredados

        public override void InsertarActualizarRegistro(bool tipoOperacion, ref string mensajeError)
        {
            if (tipoOperacion)
            {
                InsertarRegistro(ref mensajeError);
            }

            else
            {
                ActualizarRegistro(ref mensajeError);
            }
        }

        private void InsertarRegistro(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Insertar_Empleado(IdUsuarioInicioSeccion, Cedula, Nombre, Apellido, Correo, Direccion, IdCarreraProfesional, TelefonoCasa,
                            TelefonoCelular, IdTipoEmpleado, IdGimnasio, IdDepartamento, IdCalendarioLaboral, FechaIngreso, IdEstado, ref mensajeError);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        private void ActualizarRegistro(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Actualizar_Empleado(IdUsuarioInicioSeccion, IdEmpleado, Cedula, Nombre, Apellido, Correo, Direccion, IdCarreraProfesional, TelefonoCasa,
                            TelefonoCelular, IdTipoEmpleado, IdGimnasio, IdDepartamento, IdCalendarioLaboral, FechaIngreso, IdEstado, ref mensajeError);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        public override cls_Base TraerObjeto()
        {
            try
            {
                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    ISingleResult<SP_Seleccionar_Datos_EmpleadosResult> resultado = db.SP_Seleccionar_Datos_Empleados(IdUsuarioInicioSeccion, IdEmpleado);
                    DataTable dt = cls_Adaptador.ToDataTable(resultado.ToList());

                    if (dt != null & dt.Rows.Count > 0)
                    {
                        DataRow fila = dt.Rows[0];
                        IdEmpleado = Convert.ToInt32(fila[0].ToString());
                        Cedula = fila[1].ToString();
                        Nombre = fila[2].ToString();
                        Apellido = fila[3].ToString();
                        Correo = fila[4].ToString();
                        Direccion = fila[5].ToString();
                        IdCarreraProfesional = Convert.ToInt32(fila[6].ToString());
                        TelefonoCasa = Convert.ToInt32(fila[7].ToString());
                        TelefonoCelular = Convert.ToInt32(fila[8].ToString());
                        IdTipoEmpleado = Convert.ToInt32(fila[9].ToString());
                        IdGimnasio = Convert.ToInt32(fila[10].ToString());
                        IdDepartamento = Convert.ToInt32(fila[11].ToString());
                        IdCalendarioLaboral = Convert.ToInt32(fila[12].ToString());
                        FechaIngreso = Convert.ToDateTime(fila[13].ToString());
                        FechaLiquidacion = Convert.ToDateTime(fila[14].ToString());
                        IdEstado = Convert.ToInt32(fila[15].ToString());
                    }

                    else
                    {
                        MensajeError = "Empleado no existente";
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }

            return this;
        }


        public override bool EliminarRegistro(ref string mensajeError)
        {
            bool resultado = true;

            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Borrar_Empleados(IdUsuarioInicioSeccion, IdEmpleado, ref mensajeError);

                        transaction.Complete();

                        if (MensajeError != null)
                        {
                            resultado = false;
                        }
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                resultado = false;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                resultado = false;
            }

            return resultado;
        }

        public override DataTable Listar(int opcion)
        {
            try
            {
                DataTable dt = new DataTable();

                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    if (opcion == 1)
                    {
                        ISingleResult<SP_Seleccionar_Todo_EmpleadosResult> resultado = db.SP_Seleccionar_Todo_Empleados(IdUsuarioInicioSeccion);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else if (opcion == 2)
                    {
                        ISingleResult<SP_Seleccionar_Filtro_EmpleadosResult> resultado = db.SP_Seleccionar_Filtro_Empleados(IdUsuarioInicioSeccion, Convert.ToInt32(Filtros[0]), Filtros[1]);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else if (opcion == 3)
                    {
                        dt = ListarTipoEmpleado();
                    }
                }

                return dt;
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return null;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return null;
            }
        }

        public override void OtrosProcesos(int opcion, ref object resultado)
        {
            switch (opcion)
            {
                case 1:
                    resultado = TotalHorasLaboradas();
                    break;

                case 2:
                    InformePagoPlanilla();
                    break;

                case 3:
                    InformeLiquidacion();
                    break;

                case 4:
                    string mensajeError = string.Empty;
                    AsignarFechaLiquidacionEmpleado(ref mensajeError);

                    break;

                default:
                    break;
            }
        }

        #endregion

        #region Metodos Propios

        /// <summary>
        /// Metodo que se utilizara para listar los diferentes empelados:
        /// 1. TI
        /// 2. Proveduria
        /// 3. Departamento
        /// </summary>
        /// <returns></returns>
        private DataTable ListarTipoEmpleado()
        {
            try
            {
                DataTable dt = new DataTable();

                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    if (Convert.ToInt32(Filtros[0]) == 1)
                    {
                        ISingleResult<SP_Seleccionar_Empleados_TIResult> resultado = db.SP_Seleccionar_Empleados_TI(IdUsuarioInicioSeccion);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else if (Convert.ToInt32(Filtros[0]) == 2)
                    {
                        ISingleResult<SP_Seleccionar_Empleados_ProveduriaResult> resultado = db.SP_Seleccionar_Empleados_Proveduria(IdUsuarioInicioSeccion);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else if (Convert.ToInt32(Filtros[0]) == 3)
                    {
                        ISingleResult<SP_Seleccionar_Empleados_DepartamentosResult> resultado = db.SP_Seleccionar_Empleados_Departamentos(IdUsuarioInicioSeccion, IdDepartamento);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }
                }

                return dt;
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return null;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return null;
            }
        }

        private int TotalHorasLaboradas()
        {
            try
            {
                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    return (int)db.FN_Seleccionar_Total_Dias_Laborados(IdEmpleado, Convert.ToDateTime(Filtros[0])) + 1;
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return 1;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return 1;
            }
        }

        private void AsignarFechaLiquidacionEmpleado(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Asignar_Fecha_Liquidacion_Empleado(IdUsuarioInicioSeccion, IdEmpleado, ref mensajeError);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        private void InformePagoPlanilla()
        {
            try
            {
                Attachment item = new Attachment(string.Format(@"\Planillas Pagadas\Comprobante_Planilla.docx_{0}.pdf", Apellido), MediaTypeNames.Application.Pdf);

                cls_EnviarCorreos enviarCorreo = new cls_EnviarCorreos()
                {
                    Destinatario = this.Correo,
                    Asunto = string.Format("Planilla del: ({0})", DateTime.Now.ToString("dd / MMM / yyy")),
                    Mensaje = string.Format("Señor(a) {0} {1} , <br><br> Se ha realizado el deposito de la planilla. <br>Este mensaje solo es informacion." +
                              "\nPor no responder este correo. <b></b><br><br><br><br> Muchas Gracias<br>Dudas presentarse a las oficinas centrales.", Nombre, Apellido),
                };

                enviarCorreo.Email.Attachments.Add(item);
                enviarCorreo.envioCorreoElectronico(IdUsuarioInicioSeccion, ref Filtros[0]);
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        private void InformeLiquidacion()
        {
            try
            {
                cls_EnviarCorreos enviarCorreo = new cls_EnviarCorreos()
                {
                    Destinatario = this.Correo,
                    Asunto = string.Format("Planilla del: ({0})", DateTime.Now.ToString("dd / MMM / yyy")),
                    Mensaje = string.Format("Señor(a) {0} {1}, <br><br> Por este medio se le comunica que ya se encuentra su liquidacion; por un monto de: {2}. <br>" +
                              "Este mensaje solo es informacion.\nPor no responder este correo. <b></b><br><br><br><br> Muchas Gracias<br>Dudas presentarse a las oficinas centrales.", Nombre, Apellido, Filtros[1]),
                };

                enviarCorreo.envioCorreoElectronico(IdUsuarioInicioSeccion, ref Filtros[0]);
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        #endregion

    }
}
